home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Wayzata's Best of Shareware PC/Windows 2
/
Wayzata's Best of Shareware 2.0 (Windows) (Wayzata Technology)(7112)(1994).bin
/
pc
/
dos
/
programg
/
forthcmp
/
scrdif.4th
< prev
next >
Wrap
Text File
|
1992-03-29
|
4KB
|
143 lines
\ SCREEN FILE COMPARISON PROGRAM
\ COPYRIGHT (C) 1985 BY THOMAS ALMY. ALL RIGHTS RESERVED.
\ Users of ForthCMP are given permission to use or distribute this
\ program, as long as no charge is made and the credit message is maintained.
\ Uses memory for buffer area for maximum performance.
100 MSDOS
INCLUDE VARS
INCLUDE DOS1
0 CONSTANT FALSE
-1 CONSTANT TRUE
1024 CONSTANT B/BLK
HCB FILE1
HCB FILE2
VARIABLE DIFFLG \ TRUE when differences exist
VARIABLE SCR# \ current screen number
VARIABLE #BLKS \ number of buffered block pairs
VARIABLE ACT1 \ number filled for file 1
VARIABLE ACT2 \ number filled for file 2
VARIABLE BUF1ST \ start of first buffer
VARIABLE BUF2ST \ start of second buffer
VARIABLE INDX \ index into buffers
2 1 IN/OUT
: SCR<> ( string1 string2 -- flag, true if different )
FALSE -ROT B/BLK 0 ?DO
OVER I + C@ OVER I + C@
<> IF ROT DROP TRUE -ROT LEAVE THEN
LOOP
2DROP ;
0 0 IN/OUT
: INITIALIZE-DATA
PAD DUP BUF1ST ! S0 @ 100 - OVER - 0 B/BLK 2* UM/MOD NIP
DUP #BLKS ! DUP ACT1 ! DUP ACT2 ! DUP INDX !
B/BLK * + BUF2ST !
DIFFLG OFF SCR# OFF ;
0 0 IN/OUT
: FILL-BUFFERS
FILE1 BUF1ST @ #BLKS @ B/BLK * FREAD
0 B/BLK UM/MOD NIP ACT1 !
FILE2 BUF2ST @ #BLKS @ B/BLK * FREAD
0 B/BLK UM/MOD NIP ACT2 !
INDX OFF ;
: READ-SCREENS? ( -- addr1 addr2 flag1 flag2 )
( no addr'S if either flag is zero )
INDX @ #BLKS @ = IF FILL-BUFFERS THEN
INDX @ ACT1 @ = IF FALSE INDX @ ACT2 @ <> EXIT THEN
INDX @ ACT2 @ = IF TRUE FALSE EXIT THEN
INDX @ B/BLK * BUF1ST @ OVER + SWAP BUF2ST @ +
TRUE TRUE
1 INDX +! ;
0 0 IN/OUT
: HELLO
." Forth Screenfile Comparison Program" CR
." Copyright (C) 1985 by Thomas Almy. All Rights Reserved"
;
1 0 IN/OUT
: .DIFS ( scr# -- )
DIFFLG @ 0= IF CR ." Different: " DIFFLG ON THEN
. ;
2 0 IN/OUT
: .LARGER ( firstfileflg scr# -- ) SWAP CR DIFFLG ON
IF ." First" ELSE ." Second" THEN
." file larger, starting screen " . ;
0 0 IN/OUT
: ?THE-SAME DIFFLG @ 0= IF CR ." Files are identical" THEN ;
0 0 IN/OUT
: COMPARE-SCREENS
BEGIN
READ-SCREENS?
2DUP AND WHILE ( both read )
2DROP
SCR<> IF SCR# @ .DIFS THEN
1 SCR# +!
REPEAT
OVER OR IF ( one reached eof first )
SCR# @ .LARGER
ELSE ( both ended )
DROP ?THE-SAME
THEN ;
1 0 IN/OUT
: ?FNF IF CR ." File not found" bye THEN ;
1 0 IN/OUT
: ADD.DEFAULT.EXTENSION ( handle -- )
2+ DUP >R 1+ ( ext string )
BEGIN COUNT DUP ASCII . = IF DROP BEGIN COUNT DUP 0=
IF R> DROP 2DROP EXIT THEN DUP ASCII \ = SWAP ASCII / = OR UNTIL 1 THEN
0= UNTIL
DUP 1- ASCII . C<- ( replace null with dot )
CNT" SCR" 0 DO COUNT 2 PICK C! SWAP 1+ SWAP LOOP
DROP ( extension address )
DUP 0 C<- ( delimit string )
R@ - 1- R> C! ( set length byte )
;
0 0 IN/OUT
: USAGE ( only one file specified ) CR
." USAGE: SCRDIF [ filename1 filename2 ] " CR
bye ;
0 0 IN/OUT
: OPEN-FILES
129 TIB 128 C@ DUP #TIB ! CMOVE \ get command line
BL WORD C@ 0= IF USAGE THEN \ no args
HERE FILE1 NAME>HCB
FILE1 ADD.DEFAULT.EXTENSION
FILE1 O_RD FOPEN ?FNF
BL WORD C@ 0= IF USAGE THEN \ no args
HERE FILE2 NAME>HCB
FILE2 ADD.DEFAULT.EXTENSION
FILE2 O_RD FOPEN ?FNF
;
: MAIN
HELLO
INITIALIZE-DATA
OPEN-FILES
COMPARE-SCREENS
bye
;
INCLUDE DOS2
INCLUDE FORTHLIB
END